#include "stdafx.h"
#include "GameLoop.h"
#include <iostream>
#include "noiseutils.h"

DumpMemoryLeak;

#ifdef NDEBUG
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
#else
int main()
#endif
{
	GameLoop loop;
//#if 0
//
//	noise::module::Perlin myModule;
//	myModule.SetOctaveCount(6);
//	myModule.SetFrequency(0.5);
//	myModule.SetPersistence(0.25);
//	utils::NoiseMap heightMap;
//	utils::NoiseMapBuilderPlane heightMapBuilder;
//	heightMapBuilder.SetSourceModule(myModule);
//	heightMapBuilder.SetDestNoiseMap(heightMap);
//	heightMapBuilder.SetDestSize(512, 512);
//	heightMapBuilder.SetBounds(0.0, 5.0, 0.0, 5.0);
//	heightMapBuilder.Build();
//
//	utils::RendererImage renderer;
//	utils::Image image;
//	renderer.SetSourceNoiseMap(heightMap);
//	renderer.SetDestImage(image);
//	renderer.ClearGradient();
//	renderer.AddGradientPoint(-1.0000, utils::Color(0, 0, 128, 255)); // deeps
//	renderer.AddGradientPoint(-0.2500, utils::Color(0, 0, 255, 255)); // shallow
//	renderer.AddGradientPoint(0.0000, utils::Color(0, 128, 255, 255)); // shore
//	renderer.AddGradientPoint(0.0625, utils::Color(240, 240, 64, 255)); // sand
//	renderer.AddGradientPoint(0.1250, utils::Color(32, 160, 0, 255)); // grass
//	renderer.AddGradientPoint(0.3750, utils::Color(224, 224, 0, 255)); // dirt
//	renderer.AddGradientPoint(0.7500, utils::Color(128, 128, 128, 255)); // rock
//	renderer.AddGradientPoint(1.0000, utils::Color(255, 255, 255, 255)); // snow
//	renderer.Render();
//
//	utils::WriterBMP writer;
//	writer.SetSourceImage(image);
//	writer.SetDestFilename("tutorial.bmp");
//	writer.WriteDestFile();
//#if 0
//	module::RidgedMulti mountainTerrain;
//
//	module::Billow baseFlatTerrain;
//	baseFlatTerrain.SetFrequency(2.0);
//
//	module::ScaleBias flatTerrain;
//	flatTerrain.SetSourceModule(0, baseFlatTerrain);
//	flatTerrain.SetScale(0.125);
//	flatTerrain.SetBias(-0.75);
//
//	module::Perlin terrainType;
//	terrainType.SetFrequency(0.5);
//	terrainType.SetPersistence(0.25);
//
//	module::Select terrainSelector;
//	terrainSelector.SetSourceModule(0, flatTerrain);
//	terrainSelector.SetSourceModule(1, mountainTerrain);
//	terrainSelector.SetControlModule(terrainType);
//	terrainSelector.SetBounds(0.0, 1000.0);
//	terrainSelector.SetEdgeFalloff(0.125);
//
//	module::Turbulence finalTerrain;
//	finalTerrain.SetSourceModule(0, terrainSelector);
//	finalTerrain.SetFrequency(4.0);
//	finalTerrain.SetPower(0.125);
//
//	utils::NoiseMap heightMap;
//	utils::NoiseMapBuilderPlane heightMapBuilder;
//	heightMapBuilder.SetSourceModule(finalTerrain);
//	heightMapBuilder.SetDestNoiseMap(heightMap);
//	heightMapBuilder.SetDestSize(512, 512);
//	heightMapBuilder.SetBounds(6.0, 10.0, 1.0, 5.0);
//	heightMapBuilder.Build();
//
//	utils::RendererImage renderer;
//	utils::Image image;
//	renderer.SetSourceNoiseMap(heightMap);
//	renderer.SetDestImage(image);
//	renderer.ClearGradient();
//	renderer.AddGradientPoint(-1.00, utils::Color(32, 160, 0, 255)); // grass
//	renderer.AddGradientPoint(-0.25, utils::Color(224, 224, 0, 255)); // dirt
//	renderer.AddGradientPoint(0.25, utils::Color(128, 128, 128, 255)); // rock
//	renderer.AddGradientPoint(1.00, utils::Color(255, 255, 255, 255)); // snow
//	renderer.EnableLight();
//	renderer.SetLightContrast(3.0);
//	renderer.SetLightBrightness(2.0);
//	renderer.Render();
//
//	utils::WriterBMP writer;
//	writer.SetSourceImage(image);
//	writer.SetDestFilename("tutorial.bmp");
//	writer.WriteDestFile();
//#endif
//#else
//	module::Perlin myModule;
//	myModule.SetOctaveCount(10);
//	myModule.SetSeed(999);
//
//	utils::NoiseMap heightMap;
//	utils::NoiseMapBuilderSphere heightMapBuilder;
//	heightMapBuilder.SetSourceModule(myModule);
//	heightMapBuilder.SetDestNoiseMap(heightMap);
//	heightMapBuilder.SetDestSize(1024, 512);
//	heightMapBuilder.SetBounds(-90.0, 90.0, -180.0, 180.0);
//	//heightMapBuilder.SetBounds(-15.0, 15.0, 50.0, 80.0);
//	heightMapBuilder.Build();
//
//	utils::RendererImage renderer;
//	utils::Image image;
//	renderer.SetSourceNoiseMap(heightMap);
//	renderer.SetDestImage(image);
//	renderer.ClearGradient();
//	renderer.AddGradientPoint(-1.0000, utils::Color(0, 0, 128, 255)); // deeps
//	renderer.AddGradientPoint(-0.2500, utils::Color(0, 0, 255, 255)); // shallow
//	renderer.AddGradientPoint(0.0000, utils::Color(0, 128, 255, 255)); // shore
//	renderer.AddGradientPoint(0.0625, utils::Color(240, 240, 64, 255)); // sand
//	renderer.AddGradientPoint(0.1250, utils::Color(32, 160, 0, 255)); // grass
//	renderer.AddGradientPoint(0.3750, utils::Color(224, 224, 0, 255)); // dirt
//	renderer.AddGradientPoint(0.7500, utils::Color(128, 128, 128, 255)); // rock
//	renderer.AddGradientPoint(1.0000, utils::Color(255, 255, 255, 255)); // snow
//	renderer.EnableLight();
//	renderer.SetLightContrast(3.0);
//	renderer.SetLightBrightness(2.0);
//	renderer.Render();
//
//	utils::WriterBMP writer;
//	writer.SetSourceImage(image);
//	writer.SetDestFilename("tutorial.bmp");
//	writer.WriteDestFile();
//#endif

	//noise::module::Perlin myModule;
	//myModule.SetOctaveCount(6);
	//myModule.SetFrequency(0.5);
	//myModule.SetPersistence(0.5);
	//utils::NoiseMap heightMap;
	//utils::NoiseMapBuilderPlane heightMapBuilder;
	//heightMapBuilder.SetSourceModule(myModule);
	//heightMapBuilder.SetDestNoiseMap(heightMap);
	//heightMapBuilder.SetDestSize(512, 512);
	//heightMapBuilder.SetBounds(0.0, 5.0, 0.0, 5.0);
	//heightMapBuilder.Build();
	//
	//utils::RendererImage renderer;
	//utils::Image image;
	//renderer.SetSourceNoiseMap(heightMap);
	//renderer.SetDestImage(image);
	//renderer.ClearGradient();
	//renderer.AddGradientPoint(-1.0, utils::Color(0, 0, 255, 255));
	//renderer.AddGradientPoint(-0.9, utils::Color(128, 128, 255, 255));
	//renderer.AddGradientPoint(-0.8, utils::Color(32, 160, 0, 255));
	//renderer.AddGradientPoint(0.5, utils::Color(224, 224, 0, 255));
	//renderer.AddGradientPoint(0.9, utils::Color(128, 128, 128, 255));
	//renderer.AddGradientPoint(1.0, utils::Color(255, 255, 255, 255));


	//renderer.Render();

	//utils::WriterBMP writer;
	//writer.SetSourceImage(image);
	//writer.SetDestFilename("tutorial.bmp");
	//writer.WriteDestFile();
	


	if ( loop.Init() )
		loop.Run();
	loop.Destroy();

	return 0;
}